/**
 * 将Object属于语言内部的方法放到Reflect上
 * 修改某些Object方法的返回结果，让其更合理
 * 让object操作变成函数行为
 * Reflect对象的方法与Proxy方法一一对应
 * 
 */

// 将Object属于语言内部的方法放到Reflect上
// let obj ={}
// let newVal=''
// Reflect.defineProperty(obj,'name',{
//     get(){
//         // console.log('get');
//         return newVal
//     },
//     set(val){
//         console.log('set');
//         newVal=val
//     }
// })

// obj.name='ws'
// console.log(obj.name);
// console.log(obj);


// console.log('assign' in Object);//true
// console.log(Reflect.has(Object,'assign'));//true


 let userinfo={
     name:"zsb",
     age:24,
     _password:'**'
 }

 userinfo=new Proxy(userinfo,{
     get(target,prop){
        if (prop.startsWith('_')) {
            throw new Error('不可访问')
        }else{
            // return target[prop] 可以用下边改写
            return Reflect.get(target,prop)
        }
     },
     set(target,prop,val){
         if (prop.startsWith('_')) {
            throw new Error('不可访问')
         }else{
            //  target[prop]=val
            Reflect.set(target,prop,val)
             return true
         }
     },
     deleteProperty(target,prop){
        //  拦截删除
        if (prop.startsWith('_')) {
            throw new Error('不可访问')
         }else{
            // delete target[prop]
            Reflect.delete(target,prop)
             return true
         }
     }
 })
 console.log(userinfo.name);//zsb
 userinfo.age=18
 console.log(userinfo.age);